[PHP] Sesja, cookies - bezpieczeństwo, logowanie

Witam. Dużo czyta się o bezpieczeństwie przechowywania danych w sesji. Z tego co udało mi się znaleźć w internecie nie należy przechowywać hasła, ważnych danych (np numery kart kredytowych itp). To wydaje się być logiczne, gdyż w przypadku przechwycenia danych sesji dane są ujawnione. Jak to jest w przypadku wstrzyknięcia danych sesji ? Mógłby ktoś podać konkretny przykład wstrzyknięcia danych sesji? Bo aktualnie nie mam pomysłu na wykonanie tego, a jak wiadomo większość przykładów logowania dostępnego w internecie odbywa się na zasadzie if sesja != null zalogowany przechwytujemy sesje i wiemy, że przechowywany jest w niej np. login... W jaki sposób ktoś może wstrzyknąć dany login do mojej aplikacji, jeżeli jak wiadomo domyślnie sesja przekazywana jest pomiędzy daną stroną i danym adresem.

  • Session hijacking bo tak to się nazywa może być bardzo nieprzyjemne w skutkach dla naszego serwisu. Najprostszym sposobem jest pobranie identyfikatora sesji SESSID i doklejenie go do adresu co powoduje, że użytkownik, który tego dokonuje staje się tym "prawdziwym" użytkownikiem. Przejęcie takich danych jako login i hasło i podszywanie się pod kogoś jest już traktowane jak przestępstwo. Za pomocą funkcji session_regenerate_id(true) w pewien sposób możemy zabezpieczyć się przed przechwytywaniem danych w sesji. Sama funkcja bez true zmienia bieżący identyfikator sesji na nowy, automatycznie wygenerowany. Z opcją true identyfikator sesji strony zostaje skasowany co mimo przechwycenia spowoduje po ponownym przeładowaniu strony brak możliwości jego wykorzystania.

  • Aby uniknąć tzw. przechwycenia sesji warto wprowadzić dodatkowe zabezpieczenie, IP-check. Trzeba sprawdzać IP użytkownika, i w razie jego zmiany, wylogować go (nawet jeśli sesja się zgadza). To utrudnia przejęcie sesji. Nie wiem czy do końca o to Ci chodziło, ale ogólna rada jest taka, żeby w ciasteczkach nie przechowywać żadnych ważnych informacji. Wystarczy id sesji.

  • Zakładam, że id sesji nie jest przekazywane przez adres url, mam zastosowane regenerate id. W sesji przechowuje login i tylko login i warunkiem jest (if login != null -> zalogowany). Mógłby ktoś podać przykład wstrzyknięcia sesji? Bo nie mogę takowego sobie nadal wyobrazić.

  • Zakładam, że id sesji nie jest przekazywane przez adres url, mam zastosowane regenerate id. W sesji przechowuje login i tylko login i warunkiem jest (if login != null -> zalogowany). Mógłby ktoś podać przykład wstrzyknięcia sesji? Bo nie mogę takowego sobie nadal wyobrazić.

  • jak pisalem w innym temacie: sprawdzac ip (wisac w sesje podczas logowania ip usera i na kazdej podstronie spr czy sie zgadza) do tego user agenta przeglądarki i w momencie wylogowania wywołac session_destroy() i jest ok

  • Doklejanie SESSID do adresu to w tej chwili anachronizm, Rzadko już w jakim serwisie stosuje się przesyłanie identyfikatora sesji GET-em z uwagi na liczne mankamenty tego rozwiązania. Korzystając ze standardowych sesji - przynajmniej w PHP trzeba pamiętać przede wszystkim o zmianie domyślnej lokalizacji plików sesji. Służy do tego funkcja session_save_path lub też można to zrobić za pomocą dyrektywy konfiguracyjnej session.save_path.

    ini_set('session.save_path', '/bezpieczna/lokalizacja/sesji');
    

    Można też pokusić się o własny mechanizm zarządzania sesją oparty np. o bazę danych.

    Sprawdzanie adresu IP to kiepski pomysł z uwagi choćby na serwery proxy czy też brak stałego IP.

    Więcej o bezpieczeństwie sesji w PHP można przeczytać w artykule Session Hijacking na wortalu php.pl lub też artykułu "Bezpieczeństwo sesji w PHP - zarys problemu".

Zaloguj się, aby dodać swoją odpowiedź